昨天介紹了 Go 語言環境安裝及印出第一個 Hello World ,今天繼續來介紹用 var 宣告變數!
變數就像是一個可以用來暫時存放資料的標籤紙,我將我想存放的資料(值)取個名字(變數名稱),當我想要對這個資料(值)做事時,就可以呼叫這個名字(變數名稱)。
正常來說若要宣告一個變數需要滿足以下四個條件:
啊為何上面是說正常來說呢?因為有些時候,我們可以視情況省略其中幾項條件,接下來就讓我們來認識各種宣告變數的方法吧!
var 就是前面提到宣告變數的第一項關鍵字,用 var 宣告變數是最基本的方式,之後介紹各種宣告變數的方法都是從 var 衍伸的。而最完整正常的宣告方式如下:
<關鍵字> <變數名稱> <資料型別> = <值>
var name string = "Krystal"
接下來一起正式在昨天練習印 Hello World 的檔案,用 var 宣告變數且印出來吧!
範例1:
package main
import "fmt"
var name string = "Krystal"
func main() {
var animal string = "Panda"
fmt.Println(name, animal)
}
範例1 (執行結果):
Krystal Panda
到這邊不知道大家會不會跟我有一樣的疑問,為什麼 name, animal
一個是在 func main() 裡面,一個是在外面呢?兩者有什麼樣的差異呢?
這個就有關於 變數作用範圍 (scope) 的問題,後面文章會有詳細介紹,這邊先簡單理解為,在不同地方宣告變數,可能會有不同的寫法,以及影響這個變數運作的範圍。
補充:
在 Go 語言中,若是有宣告一個變數,但完全沒有使用到此變數的狀況,在編譯時便會產生 『 declared but not used 』 此錯誤訊息。
這是為了避免開發者宣告一些不必要的變數,而浪費多餘的記憶體空間。
上面範例我們學習了,用 var 宣告一個變數,若想用 var 一次宣告多個不同型別、不同初始值的變數也是 ok 的!
var ( //宣告多個變數時,記得加上小括號
<變數名稱 1> <資料型別 1> = <值 1>
<變數名稱 2> <資料型別 2> = <值 2>
...
<變數名稱 N> <資料型別 N> = <值 N>
)
範例2:
package main
import (
"fmt"
"time"
)
var (
isRain bool = false // 布林值
month string = "September" // 字串
today time.Time = time.Now() // 日期
)
func main() {
fmt.Println(isRain, month, today)
}
範例2 (執行結果):
false September 2022-08-07 22:35:20.413023 +0800 CST m=+0.000132306
在前面我們有提到宣告變數四寶,但事實上並不需要同時寫好型別和初始值,兩者可以擇一即可,因為今天當宣告變數時,只給型別而沒有初始值時, Go 會自動賦予此變數零值(zero value),反之,若只給初始值而沒有型別時,Go 會根據初始值來推斷型別。
範例3:
package main
import (
"fmt"
"time"
)
var (
isRain bool // 省略初始值
month = "September" // 省略型別
today = time.Now() // 省略型別
)
func main() {
fmt.Println(isRain, month, today)
}
範例3 執行結果:
false September 2022-08-07 22:49:11.553669 +0800 CST m=+0.000134740
雖說省略初始值時, Go 會自動幫我們推斷型別,但也總會有推斷型別發生錯誤的時候,如下:
範例4:
package main
import "math/rand"
func main() {
var seed = 1234456789
rand.Seed(seed)
}
範例4 執行結果:
cannot use seed (variable of type int) as type int64 in argument to rand.Seed
為什麼噴錯了呢???在學習寫程式的時候,總常常會遇到錯誤訊息,但這時不要慌,仔細看看錯誤訊息,總會發現些蛛絲馬跡的!像上方的錯誤訊息就是再說他猜測 seed
的型別是 int ,但是 rand.Seed()
的參數卻是要 int64。
當我們看懂他想表達的,想必大家都知道要怎麼除錯了吧?!沒錯就是在宣告 seed 變數時,補上 int64 型別!
範例5:
package main
import "math/rand"
func main() {
var seed int64 = 1234456789 //在這邊補上型別即正確
rand.Seed(seed)
}
今天先介紹最基本的,用 var 宣告一個或多個變數 (variables) ,以及可以省略型別或是初始值,明天繼續介紹其他宣告變數的方式,那我們明天見~